/**
 * 对象value值更新:非深层对象
 * assignObjToObj({key: 1, value: 2}, {key:2, value: 0, data: 3}) => {key: 2, value: 0}
 * @param {*} obj1 被赋值对象
 * @param {*} obj2 赋值对象
 * @param {*} options: 参数： nullTextends: null 替换
 */
export function assignObject(obj1: Recordable, obj2: Recordable, options: Recordable = {}) {
  const { nullTextends } = options
  for (const key in obj1) {
    if (Object.prototype.hasOwnProperty.call(obj2, key)) {
      obj1[key] = obj2[key] !== null ? obj2[key] : nullTextends
    }
  }
}


/**
 * 深拷贝
 * @param source
 * @returns {Array}
 */
export const deepClone=(source:any)=> {
  if (!source && typeof source !== "object") {
    throw new Error("error arguments", "deepClone");
  }
  const targetObj:any = source.constructor === Array ? [] : {};
  Object.keys(source).forEach(keys => {
    if (source[keys] && typeof source[keys] === "object") {
      targetObj[keys] = deepClone(source[keys]);
    } else {
      targetObj[keys] = source[keys];
    }
  });
  return targetObj;
}

/**
 * 对象重置（清空）方法
 * @param obj 需要重置的对象
 * @param defaultValue 重置的默认值，默认为空字符串
 */
export function resetObject(
  obj: Recordable, 
  defaultValue: any = '', 
) {
  // 重置整个对象
  for (const k in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, k)) {
      // 如果是嵌套对象，则递归重置
      if (obj[k] && typeof obj[k] === 'object' && !Array.isArray(obj[k])) {
        resetObject(obj[k], defaultValue);
      } else {
        obj[k] = defaultValue;
      }
    }
  }
}